package com.alquimia.truco.dominio.modelo;

import java.util.EnumMap;
import java.util.EnumSet;

/**
 * Created by Ivo on 09/07/2014.
 */
public class OpcionAccion {

    private final static EnumMap<Accion, EnumSet<Accion>> acciones = new EnumMap(Accion.class);
    private static OpcionAccion instancia = null;

    static {
        acciones.put(Accion.ENVIDO, EnumSet.of(Accion.ENVIDO, Accion.REAL_ENVIDO, Accion.FALTA_ENVIDO, Accion.QUIERO, Accion.NO_QUIRO));
        acciones.put(Accion.REAL_ENVIDO, EnumSet.of(Accion.FALTA_ENVIDO, Accion.QUIERO, Accion.NO_QUIRO));
        acciones.put(Accion.FALTA_ENVIDO, EnumSet.of(Accion.QUIERO, Accion.NO_QUIRO));
        acciones.put(Accion.TRUCO, EnumSet.of(Accion.RE_TRUCO, Accion.QUIERO, Accion.NO_QUIRO));
        acciones.put(Accion.RE_TRUCO, EnumSet.of(Accion.VALE_CUATRO, Accion.QUIERO, Accion.NO_QUIRO));
        acciones.put(Accion.VALE_CUATRO, EnumSet.of(Accion.QUIERO, Accion.NO_QUIRO));
    }

    private OpcionAccion() {
        super();
    }

    public static OpcionAccion instancia() {
        return crearInstancia();
    }

    private static OpcionAccion crearInstancia() {

        if (instancia == null) {
            synchronized (instancia) {
                instancia = new OpcionAccion();
            }
        }
        return instancia;
    }

    public Accion[] accionesPosibles(Accion aEstadoAccion) {

        if (aEstadoAccion == null)
            throw new NullPointerException("La acción no puede ser nula.");

        return acciones.get(aEstadoAccion).clone().toArray(new Accion[0]);
    }
}
